from pywinauto import ElementNotFoundError
from tools.logger import logger
import time


class LoginAssertionAPI:
    """
    登录模块专用断言类
    提供登录成功/失败的断言方法
    """

    @staticmethod
    def assert_login_success(app_manager):
        """
        断言登录成功：能够连接到主窗口
        :param app_manager: AppManager 实例
        :raises: AssertionError 如果主窗口未在规定时间内出现
        """
        try:
            logger.info("🔍 断言：登录应成功，正在等待主窗口...")
            main_win = app_manager.connect_to_main()
            if main_win.is_visible():
                logger.info("✅ 断言通过：已成功进入主界面")
                return main_win
            else:
                raise AssertionError("主窗口未显示")
        except Exception as e:
            logger.error("❌ 断言失败：未成功进入主界面")
            raise AssertionError(f"登录失败：无法进入主界面 - {str(e)}") from e

    @staticmethod
    def assert_login_failure_with_message(login_window, expected_message, timeout=5):
        """
        断言登录失败，并检查错误提示消息是否正确
        :param login_window: 登录窗口实例（生产信息设置窗口）
        :param expected_message: 期望的错误提示文本，如 "项目号不能为空"
        :param timeout: 等待错误提示出现的超时时间
        :raises: AssertionError 如果未出现提示或文本不匹配
        """
        error_label_id = "tipinfolbl"  # 根据你提供的 auto_id
        start_time = time.time()

        logger.info(f"等待错误提示出现: '{expected_message}' (超时: {timeout}s)")

        while time.time() - start_time < timeout:
            try:
                # 直接通过 auto_id 定位错误提示 Label
                error_label = login_window.child_window(auto_id=error_label_id)
                error_label.wait('visible', timeout=1)  # 等待短暂出现

                actual_text = error_label.window_text().strip()

                if not actual_text:
                    time.sleep(0.2)
                    continue

                if expected_message in actual_text:
                    logger.info(f"✅ 断言通过：错误提示正确 → '{actual_text}'")
                    return  # 成功匹配，退出

                # 如果有文本但不匹配，可能是其他错误，继续等待或失败
                logger.debug(f"⚠️ 当前提示文本: '{actual_text}'，等待目标: '{expected_message}'")

            except ElementNotFoundError:
                logger.debug("⚠️ 尚未找到错误提示控件 'tipinfolbl'，继续等待...")
            except Exception as e:
                logger.debug(f"检查错误提示时发生异常: {e}")

            time.sleep(0.2)

        # 超时仍未找到匹配提示
        raise AssertionError(
            f"❌ 未在 {timeout} 秒内找到包含 '{expected_message}' 的错误提示。\n"
            f"可能原因：\n"
            f"  - 控件 auto_id 不是 'tipinfolbl'（请用 Inspect.exe 确认）\n"
            f"  - 提示未出现或延迟过长\n"
            f"  - UI 结构已变更"
        )